﻿#pragma once

#include <vector>

#include <Aclapi.h>
//#pragma comment(lib, "Advapi32.lib")

/******************************
命令行：
net use 能显示所有本地映射，包括无盘符的本地映射
net use * /delete 删除所有本地映射，如果映射到本地磁盘的似乎要重启电脑或者重新注销登录后才能刷新，但是实际已经不能访问，有稍微延时
*******************************/



class ShareFolder
{
public:
	// 启用某个账户对某个文件(夹)的所有操作权限  
	// pszPath: 文件(夹)路径  
	// pszAccount: 账户名称 
	static bool EnableFileAccountPrivilege(const TCHAR * pszPath, const TCHAR *  pszAccount);

	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 删除共享，设置为非共享, 共享名称, 共享名称不一定等于目录名
	static bool DelShare(TCHAR *  pShareName);
	// 设置为共享
	static bool SetShare(TCHAR * pszSharePath, TCHAR * pszShareName);
	static bool SetShare(TCHAR * pszSharePath, TCHAR * pszShareName, TCHAR * pszUserAccount);	//不建议这里添加共享用户，使用EnableFileAccountPrivilege添加用户更好
	// 枚举本地设置为共享的目录和共享名称shareVec<本地共享目录路径，共享名称>
	static bool EnumLocalShare(std::vector<std::pair<std::wstring, std::wstring>>& shareVec);

	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 管理映射到本地的共享
	// 获取映射到本地的所有磁盘
	static bool GetRemoteDisk(std::vector<std::wstring>& driveNameVec, std::wstring& strErr);
	// 由映射到本地的磁盘名称获取远程共享名称
	static bool GetRemoteName(const std::wstring strLocalName, std::wstring& strRemoteName);
	// 查询本地已经映射好的共享目录// 获取映射到本地的所有磁盘和远程共享名称localRemoteNameVec<本地映射磁盘盘符，远端共享的名称>
	static bool GetRemoteDisk(std::vector<std::pair<std::wstring, std::wstring>>& localRemoteNameVec, std::wstring& strErr);
	// 远端共享文件夹映射到本地磁盘
	static bool AddNetworkDriver(TCHAR * pLocalName/*=Z:*/, TCHAR * pRemoteName, const TCHAR * lpUserName, const TCHAR * lpPassword, DWORD dwFlags = CONNECT_UPDATE_PROFILE);
	static bool AddNetworkDriver(HWND hWnd);
	// 使用资源管理器显示访问共享的密码输入窗口
	static void ShowShareLogonDlg(TCHAR * pRemoteSharePath);
	static bool ShowShareLogonDlgEx(TCHAR * pRemoteSharePath, const TCHAR * lpUserName, const TCHAR * lpPassword);	// 实际为添加远端共享的本地映射，只是映射的是个空磁盘名称
	// 删除断开本地映射
	static bool DelNetworkDriver(TCHAR * pLocalName/*=Z:*/);

	// 枚举映射到本地的共享目录localRemoteNameVec<本地映射磁盘盘符，远端共享的名称>
	template<typename TFunc>
	static bool EnumResource(TFunc func, void * pUserData, DWORD dwScope = RESOURCE_GLOBALNET, DWORD dwType = RESOURCETYPE_DISK, LPNETRESOURCE lpnr = NULL);
	static bool EnumNetworkDriver(std::vector<std::pair<std::wstring, std::wstring>>& localRemoteNameVec);

};


// windows账号管理
class UserManager
{
public:	
	// 获取当前用户
	static bool GetCurrentUserName(std::wstring& strUserName);
	// 删除账号
	static bool DelAccount(TCHAR * pszAccount);
	// 添加账号
	static bool AddAccount(TCHAR * pszAccount, TCHAR * pszPassword, TCHAR * pszComment = NULL);
	// 修改账号密码
	static bool ChangeAccountPassword(TCHAR * pszAccount, TCHAR * pszOldPwd, TCHAR * pszNewPwd);
	// 将账号添加到组，如果添加到Administrators、Users等组会变成登录的账号
	static bool AddAccountToGroup(TCHAR * pszAccount, TCHAR * pszGroup);
	// 枚举本地所有用户
	static bool EnumAccount(std::vector<std::wstring>& accountVec);
};